package ve.gob.ine.censo.beans;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

import javax.faces.bean.ManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.ibatis.session.SqlSession;

import ve.gob.ine.censo.dao.ibatis.Conexion;
import ve.gob.ine.censo.dao.ibatis.sis_reportes.UsuarioMapper;
import ve.gob.ine.censo.model.sis_reportes.Usuario;
import ve.gob.ine.censo.model.sis_reportes.UsuarioExample;
import ve.gob.ine.censo.service.UsuarioServiceImpl;
import ve.gob.ine.censo.validator.LoginValidacion;


@ManagedBean(name="ManagerLogin")
public class ManagerLogin {
	private FacesContext context = FacesContext.getCurrentInstance();
	private HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
	private HttpSession objSesion = request.getSession(true);

	private Usuario usuario;
	private LoginValidacion lva = new LoginValidacion();
	
	private Mensajes objmsg = new Mensajes(); 			// Objetos de los mensajes del sistema

	
	public ManagerLogin() {
		//usuarioDAO = new UsuarioDAOImpl(Conexion.config());  // Establece la conexion el objeto DAO
		this.usuario = new Usuario();
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Mensajes getObjmsg() {
		return objmsg;
	}

	public void setObjmsg(Mensajes objmsg) {
		this.objmsg = objmsg;
	}

	public void login() throws ServletException{
		SqlSession sqlSession = Conexion.config().openSession();
		try {
		
		UsuarioExample filtro = new UsuarioExample();
		UsuarioExample filtro2 = new UsuarioExample();
		Usuario usuarioSistema;
		List <Usuario> lu;
		List <Usuario> lu2;

			filtro.createCriteria().andUsuarioLike(usuario.getUsuario()+"%");			

			lu2 = sqlSession.getMapper(UsuarioMapper.class).selectByExample(filtro);
			if (lu2.size()>0){
				usuarioSistema = lu2.get(0);
				filtro2.createCriteria().andUsuarioEqualTo(usuarioSistema.getUsuario());			
			} 
			
			lu = sqlSession.getMapper(UsuarioMapper.class).selectByExample(filtro2);
			if (lu.size()>0 && UsuarioServiceImpl.isAutentication(lu.get(0).getClave(), usuario.getClave())){
				usuarioSistema = lu.get(0);
				System.out.println("1 Usuario: !"+usuarioSistema.getUsuario()+"! Password: !"+usuarioSistema.getClave()+"! cedula: "+usuarioSistema.getCedula());

				
				objSesion.setAttribute("usuarioSistema", usuarioSistema);

				
				ExternalContext context1 = FacesContext	.getCurrentInstance ( )
				.getExternalContext ( );

				
RequestDispatcher dispatcher = 
( ( ServletRequest ) context1
	.getRequest ( ) )
	.getRequestDispatcher ( "/j_spring_security_check" );

dispatcher.forward (	( ServletRequest ) context1.getRequest ( ),
( ServletResponse ) context1.getResponse ( ) );

FacesContext.getCurrentInstance ( ).responseComplete ( );


			} else {
				objmsg.setEstilo(3); objmsg.setMensaje("Usuario o Clave Incorrecto");
			}			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
	} 
	
	public String recovery_password1(){
//		usuarioDAO = new UsuarioDAOImpl(Conexion.config());  // Establece la conexion el objeto DAO
		
		UsuarioExample filtro = new UsuarioExample();
//		Usuario usuarioSistema;
		List <Usuario> lu;
		
		SqlSession sqlSession = Conexion.config().openSession();
		try {
			filtro.createCriteria().andUsuarioEqualTo(usuario.getUsuario());			
			lu = sqlSession.getMapper(UsuarioMapper.class).selectByExample(filtro);
		} finally {
			sqlSession.close();
		}
		if (lu.size()>0){
//			usuarioSistema = lu.get(0);
			
			//usuarioSistema.getClave();
			//usuarioSistema.getEmail();				
			//envia_mail(usuarioSistema.getEmail(), usuarioSistema.getClave(), cuenta_sis, clave_sis, host_smtp, puerto_smtp);
			return "envio_email";
		} else {
			// Login  Incorrecto
			lva.msg_fallo_recupera_x_login();
			return "envio_falla";
		}			
//		usuarioDAO = null;  // Establece la conexion el objeto DAO
//		return null;
	} 

	public String recovery_password2(){
//		usuarioDAO = new UsuarioDAOImpl(Conexion.config());  // Establece la conexion el objeto DAO
		
		UsuarioExample filtro = new UsuarioExample();
//		Usuario usuarioSistema;
		List <Usuario> lu;
		SqlSession sqlSession = Conexion.config().openSession();
		try {
			filtro.createCriteria().andCorreoEqualTo(usuario.getCorreo());			
			lu = sqlSession.getMapper(UsuarioMapper.class).selectByExample(filtro);
		} finally {
			sqlSession.close();
		}			
			if (lu.size()>0){
//				usuarioSistema = lu.get(0);
				//usuarioSistema.getUsuario();
				//usuarioSistema.getClave();
				//usuarioSistema.getEmail();		
				//envia_mail(usuarioSistema.getEmail(), usuarioSistema.getClave(), cuenta_sis, clave_sis, host_smtp, puerto_smtp);
				return "envio_email";
			} else {
				// email  Incorrecto
				//System.out.println("envio_falla");
				lva.msg_fallo_recupera_x_email();
				return "envio_falla";
			}			

//		usuarioDAO = null;  // Establece la conexion el objeto DAO
//		return null;
	} 

	
	public String envia_mail(String email_user, String clave_user, String cuenta_sis, String clave_sis, String host_smtp, String puerto_smtp){
		Properties props = new Properties(); 
		
		// Nombre del host de correo, es smtp.gmail.com
		//props.setProperty("mail.smtp.host", "smtp.gmail.com");
		props.setProperty("mail.smtp.host", host_smtp);

		// TLS si est� disponible
		props.setProperty("mail.smtp.starttls.enable", "true");

		// Puerto de gmail para envio de correos
		//props.setProperty("mail.smtp.port","587");
		props.setProperty("mail.smtp.port",puerto_smtp);

		// Nombre del usuario
		props.setProperty("mail.smtp.user", cuenta_sis);

		// Si requiere o no usuario y password para conectarse.
		props.setProperty("mail.smtp.auth", "true");
		
		//Con esto estamos en disposici�n de obtener nuestra instancia de Session.
		Session session = Session.getDefaultInstance(props);

		//Hemos puesto setDebug(true) para obtener m�s informaci�n por pantalla de lo que est� sucediendo. Una vez que el programa nos funcione, podemos quitar esa l�nea sin problemas.
		session.setDebug(true);
		
		//En el constructor debemos pasarle el objeto Session que obtuvimos anteriormente		
		MimeMessage message = new MimeMessage(session);
		
		try {
			// Quien envia el correo
			message.setFrom(new InternetAddress(cuenta_sis));

			// A quien va dirigido
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(email_user));

			message.setSubject("Recuperacion de clave Siemprove");
			//message.setText("Mensajito con Java Mail de los buenos. poque si");
			message.setText("Su clave es: " + clave_user);

			//Para enviar el mensaje usamos la clase Transport, que se obtiene de Session. El m�todo getTransport() requiere un par�metro String con el nombre del protocolo a usar. Como el de gmail es smtp, pues ponemos smtp.
			Transport t = session.getTransport("smtp");
			
			//Ahora debemos establecer la conexi�n, dando el nombre de usuario y password.
			t.connect(cuenta_sis,clave_sis);			
			
			//y ahora simplemente enviamos el mensaje
			t.sendMessage(message,message.getAllRecipients());
						
			//Con esto se env�a el mensaje. Ahora solo queda cerrar la conexi�n
			t.close();
			
		} catch (AddressException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
}
